#ifndef PROJECTION_CORRECT_H
#define PROJECTION_CORRECT_H


#include "pose_correct.h"

class ProjectionCorrect :
    public PoseCorrect
{
public:
	void getProjectionMatrix(const cv::Mat& image, cv::Mat& matrix) override;

private:
	void extendPoints2Vector(const std::vector<cv::Point2f>& points, std::vector<cv::Vec3f>& vectors);

	void getProjectionHP(const std::vector<cv::Vec3f>& points, cv::Mat& matrixHP);

	void getAffineHA(const std::vector<cv::Vec3f>& points, const cv::Mat& matrixHP, cv::Mat& matrixHA);
	void getAffineS(std::vector<cv::Vec3f>& lines, cv::Mat& S);
	void cholesky(cv::Mat& A, cv::Mat& L);

	void getSimilarityHS(const std::vector<cv::Vec3f>& points, const cv::Mat& matrixHP, const cv::Mat& matrixHA, cv::Mat& matrixHS);

	cv::Vec3f convertPoint(const cv::Mat& H, const cv::Vec3f& point);
	cv::Vec3f crossMultiple(const cv::Vec3f& v1, const cv::Vec3f& v2);
};

#endif

